//package cn.yoaket.unit;
//
//import com.yoaker.algorithm.ClockComparator;
//
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Comparator;
//import java.util.List;
//
//public class Polygon {
//    List<Point> points;
//    int floor;
//
//    public Polygon() {
//        this.points = new ArrayList<>();
//        floor = 0;
//    }
//
//    public Polygon(Collection<Point> points) {
//        this.points = new ArrayList<>(points);
//        floor = 0;
//    }
//
//    public int getFloor() {
//        return floor;
//    }
//
//    public void setFloor(int floor) {
//        this.floor = floor;
//    }
//
//    public void add(Point point){
//        this.points.add(point);
//    }
//
//    public void add(Collection<Point> points){
//        this.points.addAll(points);
//    }
//
//    public void add(double x, double y){
//        this.points.add(new Point(x,y));
//    }
//
//    public void remove(int index){
//        this.points.remove(index);
//    }
//
//
//    public int size(){
//        return this.points.size();
//    }
//
//    public Point get(int index){
//        return points.get(index);
//    }
//
//    public boolean contains(Point point){
//        int iSum, iCount, iIndex;
//        double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;
//        iSum = 0;
//        iCount = size();
//
//        for (iIndex = 0; iIndex<iCount;iIndex++) {
//            if (iIndex == iCount - 1) {
//
//                dLon1 =  this.get(iIndex).getX();
//                dLat1 =  this.get(iIndex).getY();
//                dLon2 =  this.get(0).getX();
//                dLat2 =  this.get(0).getY();
//            } else {
//                dLon1 =  this.get(iIndex).getX();
//                dLat1 =  this.get(iIndex).getY();
//                dLon2 =  this.get(iIndex + 1).getX();
//                dLat2 =  this.get(iIndex + 1).getY();
//            }
//
//            double ALat = point.getY();
//            double ALon = point.getX();
//            // 以下语句判断A点是否在边的两端点的水平平行线之间，在则可能有交点，开始判断交点是否在左射线上
//            if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {
//                if (Math.abs(dLat1 - dLat2) > 0) {
//                    //得到 A点向左射线与边的交点的x坐标：
//                    dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat) ) / (dLat1 - dLat2);
//                    // 如果交点在A点左侧（说明是做射线与 边的交点），则射线与边的全部交点数加一：
//                    if (dLon < ALon) {
//                        iSum++;
//                    }
//                }
//            }
//        }
//        return (iSum % 2) != 0;
//
//    }

//    public boolean contains(Point point){
//
//        int N = this.size();
//        boolean boundOrVertex = true; //如果点位于多边形的顶点或边上，也算做点在多边形内，直接返回true
//        int intersectCount = 0;//cross points count of x
//        double precision = 2e-8; //浮点类型计算时候与0比较时候的容差
//        Point p1, p2;//neighbour bound vertices
//
//        p1 = this.get(0);//left vertex
//        for(int i = 1; i <= N; ++i){//check all rays
//            if(point.equals(p1)){
//                return boundOrVertex;//p is an vertex
//            }
//
//            p2 = this.get(i % N);//right vertex
//            if(point.x < Math.min(p1.x, p2.x) || point.x > Math.max(p1.x, p2.x)){//ray is outside of our interests
//                p1 = p2;
//                continue;//next ray left point
//            }
//
//            if(point.x > Math.min(p1.x, p2.x) && point.x < Math.max(p1.x, p2.x)){//ray is crossing over by the algorithm (common part of)
//                if(point.y <= Math.max(p1.y, p2.y)){//x is before of ray
//                    if(p1.x == p2.x && point.y >= Math.min(p1.y, p2.y)){//overlies on a horizontal ray
//                        return boundOrVertex;
//                    }
//
//                    if(p1.y == p2.y){//ray is vertical
//                        if(p1.y == point.y){//overlies on a vertical ray
//                            return boundOrVertex;
//                        }else{//before ray
//                            ++intersectCount;
//                        }
//                    }else{//cross point on the left side
//                        double xinters = (point.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y
//                        if(Math.abs(point.y - xinters) < precision){//overlies on a ray
//                            return boundOrVertex;
//                        }
//                        if(point.y < xinters){//before ray
//                            ++intersectCount;
//                        }
//                    }
//                }
//            }else{//special case when ray is crossing through the vertex
//                if(point.x == p2.x && point.y <= p2.y){//p crossing over p2
//                    Point p3 = this.get((i+1) % N); //next vertex
//                    if(point.x >= Math.min(p1.x, p3.x) && point.x <= Math.max(p1.x, p3.x)){//p.x lies between p1.x & p3.x
//                        ++intersectCount;
//                    }else{
//                        intersectCount += 2;
//                    }
//                }
//            }
//            p1 = p2;//next ray left point
//        }
//
//        //偶数在多边形外
//        //奇数在多边形内
//        return intersectCount % 2 != 0;
//    }

//    public double area(){
//        double Area = 0;  // 多边形的面积
//        int Num = this.size();  // 顶点个数
//        // 计算多边形的面积
//        for (int i = 0; i < Num-1; i++) {
//            Area += 0.5 * ((this.get(i+1).getX() * this.get(i).getY()) - (this.get(i).getX() * this.get(i+1).getY()));
//        }
//        return Math.abs(Area);
//    }
//
//    public void sortByClock(){
//        Point center = new Point();
//        double x = 0,y = 0;
//        int N = this.size();
//
//        for (int i = 0;i<N;++i) {
//            x += this.get(i).getX();
//            y += this.get(i).getY();
//        }
//        center.setLocation(x/N,y/N);
//
//        ClockComparator comparator = new ClockComparator(center);
//        this.points.sort(comparator);
//    }
//
//    //将第一点添加到末尾使闭合
//    public void sealed(){
//        if(this.size()>0)
//            this.points.add(new Point(this.points.get(0).getX(),this.points.get(0).getY()));
//    }
//
//    public List<Point> vertexes(){
//        return this.points;
//    }
//
//
//}
